from openpyxl import load_workbook, Workbook  # 添加 Workbook 导入
import os
import argparse  # 新增 argparse 导入

def clean_sales_amount(value):
    """清洗销售金额数据
    1. 删除与数字无关的字符
    2. 处理带单位的数值（如'万'）
    """
    if value is None:
        return None
    
    # 转换为字符串
    value_str = str(value).strip()
    if not value_str:
        return None
    
    # 处理带单位的数值
    multiplier = 1
    if value_str.endswith('万'):
        multiplier = 10000
        value_str = value_str[:-1]  # 删除'万'字
    elif value_str.endswith('千'):
        multiplier = 1000
        value_str = value_str[:-1]  # 删除'千'字
    elif value_str.endswith('百'):
        multiplier = 100
        value_str = value_str[:-1]  # 删除'百'字
    
    # 删除非数字字符，保留数字和小数点
    cleaned_str = ''
    for char in value_str:
        if char.isdigit() or char == '.':
            cleaned_str += char
    
    # 如果没有有效数字，返回None
    if not cleaned_str:
        return None
    
    try:
        # 转换为浮点数并应用乘数
        return float(cleaned_str) * multiplier
    except ValueError:
        return None

def clean_sales_data(input_file):
    # 构建输出文件名
    base_name = os.path.basename(input_file)
    output_file = os.path.join(os.path.dirname(input_file), f"cleaned_{base_name}")

    # 加载原始工作簿
    wb = load_workbook(input_file)
    ws = wb.active
    
    # 查找销售金额列位置
    header_row = next(ws.iter_rows(min_row=1, max_row=1))
    sale_col = None
    for idx, cell in enumerate(header_row, 1):
        if cell.value == "销售金额":
            sale_col = idx
            break
    
    if not sale_col:
        raise ValueError("未找到'销售金额'列")

    # 收集需要保留的行
    valid_rows = []
    
    # 保留标题行
    valid_rows.append([cell.value for cell in header_row])
    
    # 遍历数据行
    for row in ws.iter_rows(min_row=2):
        # 获取销售金额单元格的值
        sale_value = row[sale_col-1].value
        
        # 清洗销售金额
        cleaned_value = clean_sales_amount(sale_value)
        
        if cleaned_value is not None:
            # 创建行数据，并更新清洗后的销售金额
            row_data = [cell.value for cell in row]
            row_data[sale_col-1] = cleaned_value  # 更新销售金额
            valid_rows.append(row_data)
        else:
            # 如果清洗后的值为None，跳过该行
            continue

    # 创建新工作簿并写入数据
    new_wb = Workbook()
    new_ws = new_wb.active
    
    for row in valid_rows:
        new_ws.append(row)
    
    # 保存清洗后的文件
    new_wb.save(output_file)
    return output_file

# 使用示例
if __name__ == "__main__":
    # 创建命令行解析器
    parser = argparse.ArgumentParser(description='Excel 数据清洗工具')
    parser.add_argument('input_file', help='需要清洗的Excel文件路径')
    
    try:
        args = parser.parse_args()
        
        # 验证文件是否存在
        if not os.path.exists(args.input_file):
            raise FileNotFoundError(f"文件 {args.input_file} 不存在")
            
        cleaned_file = clean_sales_data(args.input_file)
        print(f"清洗完成，已保存为: {cleaned_file}")
        
    except (FileNotFoundError, ValueError) as e:
        print(f"错误: {str(e)}")
    except Exception as e:
        print(f"运行异常: {str(e)}")